// using System;
// using UnityEngine;
// using System.Collections;
// using System.Collections.Generic;
// using System.IO;
// using UnityEditor;
// using UnityEngine.Networking;
// using UnityEngine.UI;
//
// /// <summary>
// /// AssetBundle管理器，负责AssetBundle的打包、上传、下载和更新等功能
// /// </summary>
// public class AssetBundleManager : SingletonMono<AssetBundleManager>
// {
//     [Header("配置")]
//     [Tooltip("服务器URL")]
//     public string serverURL = "http://yourserver.com/AssetBundles/";
//     public string localSavePath = ""; // 默认为PersistentDataPath
//     
//     // UI引用
//     [HideInInspector] public Slider progressSlider;
//     [HideInInspector] public Text progressText;
//     [HideInInspector] public Text statusText;
//     
//     // 内部变量
//     private Dictionary<string, AssetBundleInfo> localAssetBundles = new Dictionary<string, AssetBundleInfo>();
//     private Dictionary<string, AssetBundleInfo> serverAssetBundles = new Dictionary<string, AssetBundleInfo>();
//     private List<string> needUpdateList = new List<string>();
//     private long totalDownloadSize = 0;
//     private long downloadedSize = 0;
//
//     // AssetBundle信息类
//     [System.Serializable]
//     public class AssetBundleInfo
//     {
//         public string name;
//         public string hash;
//         public long size;
//         public string dependencies;
//
//         public AssetBundleInfo(string name, string hash, long size, string dependencies)
//         {
//             this.name = name;
//             this.hash = hash;
//             this.size = size;
//             this.dependencies = dependencies;
//         }
//     }
//
//     // 清单文件类
//     [System.Serializable]
//     public class AssetBundleManifest
//     {
//         public string version;
//         public List<AssetBundleInfo> assetBundles = new List<AssetBundleInfo>();
//     }
//
//     // 本地版本文件路径
//     private string localVersionFilePath;
//     // 服务器版本文件URL
//     private string serverVersionFileURL;
//     // 本地AssetBundle存放路径
//     private string localAssetBundlePath;
//     // 当前版本号
//     private int currentVersion = 0;
//     // 服务器版本号
//     private int serverVersion = 0;
//     // 需要更新的文件列表
//     private List<string> filesToUpdate = new List<string>();
//
//     private void Start()
//     {
//         // 初始化路径
//         localVersionFilePath = Path.Combine(Application.persistentDataPath, "version.txt");
//         serverVersionFileURL = serverURL + "version.txt";
//         localAssetBundlePath = Application.persistentDataPath;
//         
//         // 初始化资源管理器
//         AssetBundleResourceManager.GetInstance().Initialize();
//     }
//
//     // 其他已有方法保持不变...
//     #region 打包功能
//     /// <summary>
//     /// 一键打包所有AssetBundle
//     /// </summary>
//     public void BuildAllAssetBundles()
//     {
//         // 设置输出路径
//         string outputPath = Path.Combine(Application.dataPath, "../AssetBundles/");
//         if (!Directory.Exists(outputPath))
//         {
//             Directory.CreateDirectory(outputPath);
//         }
//
//         // 根据不同平台设置目标平台
//         BuildTarget targetPlatform = EditorUserBuildSettings.activeBuildTarget;
//
//         // 构建AssetBundle
//         BuildPipeline.BuildAssetBundles(outputPath, 
//             BuildAssetBundleOptions.ChunkBasedCompression | 
//             BuildAssetBundleOptions.DeterministicAssetBundle, 
//             targetPlatform);
//
//         // 创建清单文件
//         CreateManifestFile(outputPath);
//
//         Debug.Log("AssetBundle打包完成，输出路径: " + outputPath);
//     }
//
//     /// <summary>
//     /// 创建清单文件
//     /// </summary>
//     private void CreateManifestFile(string outputPath)
//     {
//         AssetBundleManifest manifest = new AssetBundleManifest();
//         manifest.version = Application.version;
//
//         // 获取所有AssetBundle文件
//         string[] files = Directory.GetFiles(outputPath, "*", SearchOption.AllDirectories);
//         foreach (string file in files)
//         {
//             // 排除清单文件本身和.meta文件
//             if (file.EndsWith(".manifest") || file.EndsWith(".meta"))
//                 continue;
//
//             string fileName = Path.GetFileName(file);
//             FileInfo fileInfo = new FileInfo(file);
//             string hash = CalculateFileHash(file);
//             string dependencies = GetDependencies(fileName);
//
//             manifest.assetBundles.Add(new AssetBundleInfo(fileName, hash, fileInfo.Length, dependencies));
//         }
//
//         // 保存清单文件
//         string manifestPath = Path.Combine(outputPath, "AssetBundleManifest.json");
//         string jsonData = JsonUtility.ToJson(manifest, true);
//         File.WriteAllText(manifestPath, jsonData);
//     }
//
//     /// <summary>
//     /// 计算文件哈希值
//     /// </summary>
//     private string CalculateFileHash(string filePath)
//     {
//         using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
//         {
//             using (FileStream stream = File.OpenRead(filePath))
//             {
//                 byte[] hashBytes = md5.ComputeHash(stream);
//                 return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
//             }
//         }
//     }
//
//     /// <summary>
//     /// 获取AssetBundle依赖项
//     /// </summary>
//     private string GetDependencies(string assetBundleName)
//     {
//         // 在编辑器中获取依赖项
//         UnityEngine.AssetBundleManifest manifest = GetAssetBundleManifest();
//         string[] dependencies = manifest.GetAllDependencies(assetBundleName);
//         return string.Join(",", dependencies);
//     }
//
//     /// <summary>
//     /// 获取内置的AssetBundle清单
//     /// </summary>
//     private UnityEngine.AssetBundleManifest GetAssetBundleManifest()
//     {
//         // 获取当前平台的名称
//         string platformName = GetPlatformName();
//
//         // 加载主清单AssetBundle
//         AssetBundle manifestBundle = AssetBundle.LoadFromFile(Path.Combine(
//             Application.streamingAssetsPath, platformName));
//
//         if (manifestBundle == null)
//         {
//             Debug.LogError("无法加载清单AssetBundle: " + platformName);
//             return null;
//         }
//
//         // 从主清单AssetBundle中加载AssetBundleManifest对象
//         UnityEngine.AssetBundleManifest manifest = manifestBundle.LoadAsset<UnityEngine.AssetBundleManifest>("AssetBundleManifest");
//
//         // 卸载主清单AssetBundle（注意：这里只是卸载AssetBundle容器，而不是卸载其中加载的manifest对象）
//         manifestBundle.Unload(false);
//
//         return manifest;
//     }
//
//     /// <summary>
//     /// 获取平台名称
//     /// </summary>
//     private string GetPlatformName()
//     {
//         switch (Application.platform)
//         {
//             case RuntimePlatform.Android:
//                 return "Android";
//             case RuntimePlatform.IPhonePlayer:
//                 return "iOS";
//             case RuntimePlatform.WindowsPlayer:
//             case RuntimePlatform.WindowsEditor:
//                 return "Windows";
//             case RuntimePlatform.OSXPlayer:
//             case RuntimePlatform.OSXEditor:
//                 return "OSX";
//             default:
//                 return "Unknown";
//         }
//     }
//     #endregion
//
//     #region 上传功能
//     /// <summary>
//     /// 上传所有AssetBundle到服务器
//     /// </summary>
//     public void UploadAllAssetBundles()
//     {
//         StartCoroutine(UploadAssetBundlesCoroutine());
//     }
//
//     private IEnumerator UploadAssetBundlesCoroutine()
//     {
//         string localPath = Path.Combine(Application.dataPath, "../AssetBundles/");
//         string[] files = Directory.GetFiles(localPath, "*", SearchOption.AllDirectories);
//
//         foreach (string file in files)
//         {
//             // 排除.meta文件
//             if (file.EndsWith(".meta"))
//                 continue;
//
//             string fileName = Path.GetFileName(file);
//             string uploadURL = serverURL + fileName;
//
//             // 读取文件内容
//             byte[] fileData = File.ReadAllBytes(file);
//
//             // 创建表单数据
//             WWWForm form = new WWWForm();
//             form.AddBinaryData("file", fileData, fileName);
//
//             // 发送上传请求
//             using (UnityWebRequest request = UnityWebRequest.Post(uploadURL, form))
//             {
//                 yield return request.SendWebRequest();
//
//                 if (request.result != UnityWebRequest.Result.Success)
//                 {
//                     Debug.LogError("上传失败: " + request.error);
//                 }
//                 else
//                 {
//                     Debug.Log("上传成功: " + fileName);
//                 }
//             }
//         }
//
//         Debug.Log("所有AssetBundle上传完成");
//     }
//     #endregion
//
//     #region 热更新功能
//     private IEnumerator CheckForUpdatesCoroutine(Action<bool> callback)
//     {
//         // 重置状态
//         needUpdateList.Clear();
//         totalDownloadSize = 0;
//         downloadedSize = 0;
//
//         // 更新状态文本
//         if (statusText != null)
//             statusText.text = "正在检查更新...";
//
//         // 加载本地清单
//         string localManifestPath = Path.Combine(localSavePath, "AssetBundleManifest.json");
//         if (File.Exists(localManifestPath))
//         {
//             string jsonData = File.ReadAllText(localManifestPath);
//             AssetBundleManifest localManifest = JsonUtility.FromJson<AssetBundleManifest>(jsonData);
//             
//             // 转换为字典
//             localAssetBundles.Clear();
//             foreach (var info in localManifest.assetBundles)
//             {
//                 localAssetBundles[info.name] = info;
//             }
//         }
//
//         // 从服务器下载清单
//         string serverManifestURL = serverURL + "AssetBundleManifest.json";
//         using (UnityWebRequest request = UnityWebRequest.Get(serverManifestURL))
//         {
//             yield return request.SendWebRequest();
//
//             if (request.result != UnityWebRequest.Result.Success)
//             {
//                 Debug.LogError("下载服务器清单失败: " + request.error);
//                 if (statusText != null)
//                     statusText.text = "检查更新失败";
//                 callback?.Invoke(false);
//                 yield break;
//             }
//
//             string jsonData = request.downloadHandler.text;
//             AssetBundleManifest serverManifest = JsonUtility.FromJson<AssetBundleManifest>(jsonData);
//             
//             // 转换为字典
//             serverAssetBundles.Clear();
//             foreach (var info in serverManifest.assetBundles)
//             {
//                 serverAssetBundles[info.name] = info;
//             }
//         }
//
//         // 比较本地和服务器清单
//         foreach (var serverInfo in serverAssetBundles.Values)
//         {
//             // 跳过清单文件本身
//             if (serverInfo.name == "AssetBundleManifest.json")
//                 continue;
//
//             if (!localAssetBundles.TryGetValue(serverInfo.name, out AssetBundleInfo localInfo) ||
//                 localInfo.hash != serverInfo.hash)
//             {
//                 needUpdateList.Add(serverInfo.name);
//                 totalDownloadSize += serverInfo.size;
//             }
//         }
//
//         // 更新状态文本
//         if (statusText != null)
//         {
//             if (needUpdateList.Count > 0)
//                 statusText.text = $"发现 {needUpdateList.Count} 个更新，共 {totalDownloadSize}";
//             else
//                 statusText.text = "已是最新版本";
//         }
//
//         callback?.Invoke(needUpdateList.Count > 0);
//     }
//     
//     /// <summary>
//     /// 检查更新
//     /// </summary>
//     public void CheckForUpdates(Action<bool> callback)
//     {
//         StartCoroutine(CheckForUpdatesCoroutine(callback));
//     }
//     
//     /// <summary>
//     /// 开始更新AssetBundle
//     /// </summary>
//     /// <param name="onComplete">更新完成回调</param>
//     /// <param name="onError">更新错误回调</param>
//     public void StartUpdate(System.Action onComplete, System.Action<string> onError)
//     {
//         StartCoroutine(UpdateAssetBundles(onComplete, onError));
//     }
//
//     /// <summary>
//     /// 更新AssetBundle协程
//     /// </summary>
//     private IEnumerator UpdateAssetBundles(System.Action onComplete, System.Action<string> onError)
//     {
//         if (filesToUpdate.Count == 0)
//         {
//             if (onComplete != null)
//                 onComplete();
//             yield break;
//         }
//         
//         // UpdateStatus("准备更新...");
//         // UpdateProgress(0f);
//         
//         int totalFiles = filesToUpdate.Count;
//         int updatedFiles = 0;
//         long totalBytes = 0;
//         long downloadedBytes = 0;
//         
//         // 先获取所有文件的大小，用于计算总进度
//         foreach (string fileName in filesToUpdate)
//         {
//             using (UnityWebRequest headRequest = UnityWebRequest.Head(serverURL + fileName))
//             {
//                 yield return headRequest.SendWebRequest();
//                 
//                 if (headRequest.result != UnityWebRequest.Result.Success)
//                 {
//                     if (onError != null)
//                         onError($"获取文件大小失败: {fileName}, 错误: {headRequest.error}");
//                     yield break;
//                 }
//                 
//                 totalBytes += long.Parse(headRequest.GetResponseHeader("Content-Length"));
//             }
//         }
//         
//         // 下载所有需要更新的文件
//         foreach (string fileName in filesToUpdate)
//         {
//             // UpdateStatus($"下载中: {fileName}");
//             
//             string localPath = Path.Combine(localAssetBundlePath, fileName);
//             string tempPath = localPath + ".temp";
//             
//             // 创建目录
//             string directory = Path.GetDirectoryName(localPath);
//             if (!Directory.Exists(directory))
//                 Directory.CreateDirectory(directory);
//             
//             // 下载文件
//             using (UnityWebRequest downloadRequest = UnityWebRequest.Get(serverURL + fileName))
//             {
//                 downloadRequest.downloadHandler = new DownloadHandlerFile(tempPath);
//                 
//                 yield return downloadRequest.SendWebRequest();
//                 
//                 if (downloadRequest.result != UnityWebRequest.Result.Success)
//                 {
//                     if (onError != null)
//                         onError($"下载文件失败: {fileName}, 错误: {downloadRequest.error}");
//                     yield break;
//                 }
//                 
//                 // 下载完成，重命名文件
//                 if (File.Exists(localPath))
//                     File.Delete(localPath);
//                 
//                 File.Move(tempPath, localPath);
//                 
//                 downloadedBytes += new FileInfo(localPath).Length;
//                 updatedFiles++;
//                 
//                 // 更新进度
//                 float progress = (float)downloadedBytes / totalBytes;
//                 // UpdateProgress(progress);
//                 // UpdateStatus($"下载中: {updatedFiles}/{totalFiles}");
//             }
//         }
//         
//         // 更新本地版本文件
//         File.WriteAllText(localVersionFilePath, serverVersion.ToString());
//         currentVersion = serverVersion;
//         
//         // UpdateStatus("更新完成");
//         // UpdateProgress(1f);
//         
//         // 刷新资源管理器
//         AssetBundleResourceManager.GetInstance().Initialize();
//         
//         if (onComplete != null)
//             onComplete();
//     }
//     #endregion
//     
//     // 其他方法保持不变...
//     #region 加载功能
//     /// <summary>
//     /// 加载AssetBundle
//     /// </summary>
//     public AssetBundle LoadAssetBundle(string bundleName)
//     {
//         string loadPath = "";
//         
//         // 优先从本地更新目录加载
//         string localPath = Path.Combine(localSavePath, bundleName);
//         if (File.Exists(localPath))
//         {
//             loadPath = localPath;
//         }
//         // 否则从内置资源加载
//         else
//         {
//             loadPath = Path.Combine(Application.streamingAssetsPath, bundleName);
//         }
//
//         // 加载AssetBundle
//         AssetBundle bundle = AssetBundle.LoadFromFile(loadPath);
//         if (bundle == null)
//         {
//             Debug.LogError($"无法加载AssetBundle: {bundleName}");
//         }
//         
//         return bundle;
//     }
//
//     /// <summary>
//     /// 异步加载AssetBundle
//     /// </summary>
//     public AssetBundleCreateRequest LoadAssetBundleAsync(string bundleName)
//     {
//         string loadPath = "";
//         
//         // 优先从本地更新目录加载
//         string localPath = Path.Combine(localSavePath, bundleName);
//         if (File.Exists(localPath))
//         {
//             loadPath = localPath;
//         }
//         // 否则从内置资源加载
//         else
//         {
//             loadPath = Path.Combine(Application.streamingAssetsPath, bundleName);
//         }
//
//         // 异步加载AssetBundle
//         return AssetBundle.LoadFromFileAsync(loadPath);
//     }
//
//     /// <summary>
//     /// 加载AssetBundle中的资源
//     /// </summary>
//     public T LoadAsset<T>(string bundleName, string assetName) where T : UnityEngine.Object
//     {
//         AssetBundle bundle = LoadAssetBundle(bundleName);
//         if (bundle == null)
//             return null;
//
//         T asset = bundle.LoadAsset<T>(assetName);
//         // 注意：这里没有卸载AssetBundle，实际使用中可能需要根据情况卸载
//         
//         return asset;
//     }
//
//     /// <summary>
//     /// 异步加载AssetBundle中的资源
//     /// </summary>
//     public AssetBundleRequest LoadAssetAsync<T>(string bundleName, string assetName) where T : UnityEngine.Object
//     {
//         AssetBundle bundle = LoadAssetBundle(bundleName);
//         if (bundle == null)
//             return null;
//
//         return bundle.LoadAssetAsync<T>(assetName);
//     }
//     #endregion
//     
// }    